package com.briup.bookstore.service.impl;

import com.briup.bookstore.domain.bean.OrderItem;
import com.briup.bookstore.mapper.OrderItemMapper;
import com.briup.bookstore.service.BookService;
import com.briup.bookstore.service.OrderItemService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class OrderItemServiceImpl implements OrderItemService {

    private final BookService bookService;
    private final OrderItemMapper orderItemMapper;

    @Override
    /*
    @Transactional 注解默认会管理当前方法的事务，
    当方法执行过程中抛出异常时，会自动回滚事务，
    确保数据库操作的一致性和完整性。
     */
    @Transactional
    public void saveOrderItems(List<OrderItem> orderItems) {
        // 新增订单项之前，必须保证所有图书库存充足，并且先扣减对应图书的库存
        // 获取订单中包含的所有图书ID，及其对应的购买数量
        Map<Integer, Integer> map = orderItems.stream()
                .collect(Collectors.toMap(
                        OrderItem::getBookId,
                        orderItem -> -orderItem.getNum()));
        // 修改图书库存
        bookService.updateStock(map);
        // 在修改完库存之后，新增订单项数据
        orderItemMapper.insertBatch(orderItems);
    }
}
